// 控制流
// 条件控制 if / else / else if
// Rust 有三种循环控制： loop、while 和 for。我们每一个都试试


// if 表达式
fn control_flow_if() {
    let number = 6;

    if number % 4 == 0 {
        println!("number is divisible by 4");
    } else if number % 3 == 0 {
        println!("number is divisible by 3");
    } else if number % 2 == 0 {
        println!("number is divisible by 2");
    } else {
        println!("number is not divisible by 4, 3, or 2");
    }
}


// 在 let 语句中使用 if
fn control_flow_if_let() {
    let condition = true;
    // 有点类似三元表达式
    // 代码块的值是其最后一个表达式的值
    // 整个 if 表达式的值取决于哪个代码块被执行。这意味着 if 的每个分支的可能的返回值都必须是相同类型
    let number = if condition { 5 } else { 6 };

    println!("The value of number is: {}", number);
}

// 使用循环重复执行
// Rust 有三种循环：loop、while 和 for。我们每一个都试试
fn control_flow_loop() {
    // 无限循环
    loop {
        println!("again!");
    }
}

//
fn control_flow_loop_1() {
    let mut count = 0;
    // 通过 break 和 continue 控制循环。此处给外层 loop 循环取了一个标签 'counting_up 用于区分内外 loop
    'counting_up: loop {
        println!("count = {}", count);
        let mut remaining = 10;

        loop {
            println!("remaining = {}", remaining);
            if remaining == 9 {
                break;
            }
            if count == 2 {
                break 'counting_up;
            }
            remaining -= 1;
        }

        count += 1;
    }
    println!("End count = {}", count);
}

// 从循环返回
fn control_flow_loop_2() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}


// while 条件循环
fn control_flow_while() {
    let mut number = 3;

    while number != 0 {
        println!("{}!", number);

        number -= 1;
    }

    println!("LIFTOFF!!!");
}


// 使用 for 遍历集合
fn control_flow_for() {
    let a = [10, 20, 30, 40, 50];

    for element in a {
        println!("the value is: {}", element);
    }

    for number in (1..4).rev() {
        println!("{}!", number);
    }
    println!("LIFTOFF!!!");
}
